package ar.edu.utn.frba.disenio;

import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import ar.edu.utn.frba.disenio.exceptions.ParseException;

 public class DateParser {
	 
	 private static LocalDate parseaEnFormato(String formatoInput, String input) {
		 
		 DateTimeFormatter formato = DateTimeFormat.forPattern(formatoInput);
		 
		  try {
			  return formato.parseDateTime(input).toLocalDate();
		} catch (RuntimeException e) {
			  throw(new ParseException("No se pudo parsear la fecha: "+ input));
		  	}
	 }
	 
	 public static LocalDate parseaEnISO(String input) {
		
		return parseaEnFormato("yyyy-MM-dd", input);
	 }
	 
	 public static LocalDate parseaEnLatino(String input) {
		 
		 return parseaEnFormato("dd/MM/yyyy", input);
	 }
	 
	 public static LocalDate parseaEnNorteamericano(String input) {
		
		 return parseaEnFormato("MM-dd-yyyy", input);
	 }
	 
	 public static LocalDate parseaFlexiblemente(String input) {
		 
		  try {
			 return parseaEnISO(input);
		  } catch (ParseException  e) {
			  try {
				  return parseaEnLatino(input);
			  } catch (ParseException e1) {
				  try {
					 return parseaEnNorteamericano(input);
				  } catch (ParseException e2) {
					  throw(new ParseException("No se pudo parsear la fecha: " + input));
				  	}
			  	}
		  	}
	 }
	 
	 public int diasEntre(LocalDate fecha1, LocalDate fecha2) {
		 
		 return Math.abs(Days.daysBetween(fecha1, fecha2).getDays());
	 }
	 
	 public boolean esAnterior(LocalDate fecha1, LocalDate fecha2) {
		 
		 return (fecha1.compareTo(fecha2) == -1);
	 }
}
 
